DALS01-数据准备(Getting Started)

前言

这是一个系列的第一篇,这个系列文章是《Data Analysis for the Life Sciences》这本书的读书笔记。

此书一共分了10部分,分别为:

  • 第一章:数据准备(Getting Started)
  • 第二章:统计推断(Inference)
  • 第三章:数据挖掘(Exploratory Data Analysis)
  • 第四章:矩阵代数(Matrix Algebra)
  • 第五章:线性模型(Linear Models)
  • 第六章:高维数据推断(Inference For high Dimensional Data)
  • 第七章:统计模型(Statistical Models)
  • 第八章:距离与降低(Distance and Dimension Reduction)
  • 第九章:基础机器学习(Basic Machine Learning)
  • 第十章:批次效应(Batch Effects)

这篇笔记是《Data Analysis for the Life Sciences》第一章的内容,是关于书中原始数据的准备,相关知识主要是R语言的基础语法,文件路径操作,数学符号。

作者已经把这本书中的所有代码已经分享到了Github上,可以参考。

R语言包与原始数据准备

这本书中涉及到的统计学原理与案例分析都是通过R语言实现的,作者也把相应的脚本与数据放到了Github上。

这里先安装几个R包,如下所示:

1
2
3
4
library(devtools)
install_github("genomicsclass/dagdata")
dir <- system.file(package = "dagdata")
list.files(dir)

加载原始数据 ,如下所示:

1
2
3
4
> dir <- system.file(package = "dagdata")
> list.files(dir)
[1] "data" "DESCRIPTION" "extdata" "help" "html" "Meta"
[7] "NAMESPACE" "script"

上面的代码使用了到几个包与命令,其中devtool包中的install_github()函数用于直接从Github下载相应包,以前的笔记中已经说明了这个包的用法《R语言笔记之包的操作与内置数据集》

另外还有两个函数,其中system.file()函数的功能是:发现包的完整路径名,例如上面的变量dir的输出就是如下所示:

1
2
> dir
[1] "C:/Users/20161111/Documents/R/win-library/3.5/dagdata"

list.files()函数的功能是列出相应路径下的文件,如下所示:

1
2
3
> list.files(dir)
[1] "data" "DESCRIPTION" "extdata" "help" "html" "Meta"
[7] "NAMESPACE" "script"

使用list.files()函数还能继续列举出目录下一层目录中的内容,例如现在我们列出extdata这个目录中的内容,如下所示:

1
2
3
4
5
6
> list.files(file.path(dir,"extdata"))
[1] "admissions.csv" "astronomicalunit.csv"
[3] "babies.txt" "femaleControlsPopulation.csv"
[5] "femaleMiceWeights.csv" "mice_pheno.csv"
[7] "msleep_ggplot2.csv" "README"
[9] "spider_wolff_gorb_2013.csv"

其中这里面用到file.path()函数,它的功能是将字符串连接起来,形成路径,如下所示:

1
2
> file.path(dir,"extdata")
[1] "C:/Users/20161111/Documents/R/win-library/3.5/dagdata/extdata"

现在加载原始数据,如下所示:

1
2
3
4
5
filename <- file.path(dir,"extdata/femaleMiceWeights.csv")
dat <- read.csv(filename)
# input raw data
head(dat)
str(dat)

数据如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
> head(dat)
Diet Bodyweight
1 chow 21.51
2 chow 28.14
3 chow 24.04
4 chow 23.45
5 chow 23.68
6 chow 19.79
> str(dat)
'data.frame': 24 obs. of 2 variables:
$ Diet : Factor w/ 2 levels "chow","hf": 1 1 1 1 1 1 1 1 1 1 ...
$ Bodyweight: num 21.5 28.1 24 23.4 23.7 ...

从数据我们可以知道,这是一个数据框,有2列,第1列是小鼠的包含情况,分别是chow(正常组),hf(高脂组,就是high fat的缩写),第2列的体重,从常识可以知道,单位是g(一只标准的小鼠体重是18-22g)。

以上是原始数据的下载过程,涉及到的知识点为:R包的下载与加载,另外,也可以通过downloader包来下载原始数据,整个操作如下所示:

1
2
3
4
5
install.packages("downloader")
url <- "https://raw.githubusercontent.com/genomicsclass/dagdata/master/inst/extd\
ata/femaleMiceWeights.csv"
filename <- "femaleMiceWeights.csv"
download(url, destfile=filename)

这一过程不再演示,跟前面的目的是一样,都是下载原始数据。

有了原始数据后,现在过程一下数据,我们捏造chow组的小鼠数据,如下所示:

1
2
3
4
5
library(dplyr)
chow <- filter(dat, Diet =="chow")
# Extract chow gropu from raw data of dat
head(chow)
str(chow)

结果如下所示:

1
2
3
4
5
> chow <- filter(dat, Diet =="chow")
> str(chow)
'data.frame': 12 obs. of 2 variables:
$ Diet : Factor w/ 2 levels "chow","hf": 1 1 1 1 1 1 1 1 1 1 ...
$ Bodyweight: num 21.5 28.1 24 23.4 23.7 ...

仅提取chow组的体重,如下所示:

1
2
3
chowVals <- select(chow, Bodyweight)
head(chowVals)
str(chowVals)

结果如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> head(chowVals)
Bodyweight
1 21.51
2 28.14
3 24.04
4 23.45
5 23.68
6 19.79
> str(chowVals)
'data.frame': 12 obs. of 1 variable:
$ Bodyweight: num 21.5 28.1 24 23.4 23.7 ...
> class(chowVals)
[1] "data.frame"
> # OR perform as following:
> # chowVals <- filter(dat, Diet=="chow") %>% select(Bodyweight)

从上面结果可以看出来,chowVals是一个数据框,现在我们将其转换为数字向量:

1
2
3
chowVals <- unlist(chowVals)
str(chowVals)
class(chowVals)

如下所示:

1
2
3
4
5
> str(chowVals)
Named num [1:12] 21.5 28.1 24 23.4 23.7 ...
- attr(*, "names")= chr [1:12] "Bodyweight1" "Bodyweight2" "Bodyweight3" "Bodyweight4" ...
> class(chowVals)
[1] "numeric"

数学术语与符号

作者在书中提到,他会尽量避免使用数学术语与数学符号,但是,有一些太常见的数据符号是大家常见的,需要知道。

希腊字母

$\sum$是希腊字母中的S的写法,表示相加,例如$S=\sum_{i=1}^{n} x_{i}$

$\mu$表示未知均数,相当于m,即mean;

$\sigma$表示标准差,相当于s,即standard difference;

$\epsilon$表示随机误差,相当于error;

$\beta$表示效应,即effect。

无穷(Infinity)

书中指出,我们经常使用的统计学结果是一种渐进结果(asymptotic results)。这个渐进结果指的是一种近似(approximation),也就是说随着数据点数目的增大,这个结果只能接近,无法完全相等,只有当数据点的数目是无穷($\infty$)时,数字最接近,看下面的一个案例:

1
2
3
4
5
6
7
> onethird <- function(n) sum(3/10^c(1:n))
> 1/3 - onethird(4)
[1] 3.333333e-05
> 1/3 - onethird(10)
[1] 3.333334e-11
> 1/3 - onethird(16)
[1] 0

在这个案例中,我们就看到了,0.3的1到n次方的和是接近1/3的。

积分(Integrals)

积分在统计学也是比较常用的一个手段,有的时候要计算某个统计学分布的概率分布例如下面的这个曲线:

这个曲线是一个概率密度曲线,右下角的灰色面积占整个曲线下面积的比例,就是相应的概率(后面会讲),那么通过积分的手段来计算面积的分公式就是:

练习

原书P16页